home *** CD-ROM | disk | FTP | other *** search
- -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=Begin Listing2-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
- /*****************************************************/
- /* mlefix.c */
- /* -- Program to fix the leaky MLE bug. */
- /*****************************************************/
-
- #define NOCOMM
- #include <windows.h>
- #include "win.h"
-
- typedef LONG (FAR PASCAL * LPFN_WNDPROC)
- (HWND, WORD, WORD, DWORD);
-
- HANDLE hmemUser;
- LPFN_WNDPROC lpfnMLEFilter;
-
- LONG FAR PASCAL MLEFilter(WORD, WORD, WORD, DWORD);
- LONG FAR PASCAL MLEStub(WORD, WORD, WORD, DWORD);
- int FAR PASCAL LibMain(HANDLE, WORD, WORD, LPSTR);
- int FAR PASCAL WEP(short);
-
- int FAR PASCAL
- LibMain(HANDLE hins, WORD ds, WORD cbHeap, LPSTR lsz)
- /*****************************************************/
- /* -- hins : This library's instance. */
- /* -- ds : The library's default data segment */
- /* -- cbHeap : Size of out local heap. */
- /* -- lsz : Command line invoked with. */
- /*****************************************************/
- {
- WORD wVersion = GetVersion();
- WNDCLASS wcs;
-
- /* Only need to fix this bug for version 3.0. */
- if (LOBYTE(wVersion) != 3 || HIBYTE(wVersion) != 0)
- return FALSE;
-
- /* Get USER's default data segment. */
- if ((hmemUser = LoadLibrary("user.exe")) == 0)
- return FALSE;
-
- /* Superclass the edit class. */
- GetClassInfo(NULL, "edit", &wcs);
- lpfnMLEFilter = (LPFN_WNDPROC)wcs.lpfnWndProc;
- UnregisterClass("edit", NULL);
- wcs.lpfnWndProc = MLEStub;
- RegisterClass(&wcs);
-
- return TRUE;
- }
-
- int FAR PASCAL
- WEP(short wCode)
- /*****************************************************/
- /* -- The usual do-nothing stub. */
- /*****************************************************/
- {
- return FALSE;
- }
-
- LONG FAR PASCAL
- MLEFilter(WORD hwnd, WORD wm, WORD wParam,
- DWORD lParam)
- /*****************************************************/
- /* -- Superclasser for MLE's. */
- /* -- hwnd : Main window. */
- /* -- wm : Message type. */
- /* -- wParam, lParam : Message parameters. */
- /*****************************************************/
- {
- LONG lVal;
-
- _asm mov ax,dx;
- lVal = (*lpfnMLEFilter)(hwnd, wm, wParam, lParam);
-
- if (wm == WM_NCCREATE &&
- (GetWindowLong(hwnd, GWL_STYLE) &
- (WS_VSCROLL | WS_HSCROLL)))
- {
- WORD dsUser = HIWORD(GlobalLock(hmemUser));
- WORD dsLocal;
-
- _asm mov dsLocal, ds; /* Save ds. */
- _asm mov ds, dsUser; /* Get USER ds. */
-
- /* Free dangling USER heap memory. */
- if (((WND *)hwnd)->unknown4 != 0)
- {
- LocalFree(((WND *)hwnd)->unknown4);
- ((WND *)hwnd)->unknown4 = 0;
- }
-
- _asm mov ds, dsLocal; /* Restore ds. */
-
- /* In case of REAL mode. */
- GlobalUnlock(hmemUser);
- }
-
- return lVal;
- }
- -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=End Listing2-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-